package code16_thread;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test01 {

	/*
	 * JVM 启动时会创建一个主线程, 用来执行 main 方法,
	 * 要实现多线程, 需要在主线程中创建新的线程。
	 * 实际上, Java程序在运行时, 至少会启动两个线程: main线程、垃圾回收器GC
	 */
	public static void main(String[] args) {
		
//		// 创建线程对象
//		MyThread1 t1 = new MyThread1();
//		//t1.setName("tom");// 设置线程名, 默认线程名是 Thread-编号(编号从0开始)
//		
//		MyThread1 t2 = new MyThread1();
//		
//		t1.start();// 启动线程, 一个只能被启动一次
//		t2.start();
//		
//		for (int i = 0; i < 100; i++) {
//			// 获取当前执行此代码的线程
//			Thread currentThread = Thread.currentThread();
//			System.out.println(currentThread.getName() + ":" + i);
//		}
		
		copy("src", "E:/test1");
	}
	
	/**
	 * 使用线程复制指定目录的普通子文件到另一个目录
	 * @param path
	 * @param destPath
	 */
	public static void copy(String path, String destPath) {
		File dir = new File(path);
		if (dir.isDirectory()) {
			// 获取普通子文件
			File[] listFiles = dir.listFiles(new FileFilter() {
				@Override
				public boolean accept(File f) {
					return f.isFile();
				}
			});
			for (File f : listFiles) {
				// 一个文件让一个线程去执行复制
				Thread t = new Thread() {
					// 创建一个 Thread 的匿名内部类
					@Override
					public void run() {
						try (
								FileInputStream fis = new FileInputStream(f);
								FileOutputStream fos = new FileOutputStream(
										new File(destPath, f.getName()));
								) {
							byte[] buffer = new byte[1024];
							int len = -1;
							while ( ( len = fis.read(buffer) ) != -1 ) {
								fos.write(buffer, 0, len);
							}
							fos.flush();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				};
				System.out.println("Thread:"+t.getClass());
				// 启动
				t.start();
			}
		}
	}
}
